All files / core/view ChildChangeAccumulator.ts

75.86% Statements 22/29
52% Branches 13/25
100% Functions 3/3
75% Lines 21/28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102                                12x 12x 12x         12x 1326x         12x 595x 595x 595x           595x       595x 595x 1x 1x           1x         1x       1x                                                           594x             12x 1326x   12x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { getValues, safeGet } from '@firebase/util';
import { Change } from './Change';
import { assert, assertionError } from '@firebase/util';
 
/**
 * @constructor
 */
export class ChildChangeAccumulator {
  private changeMap_: { [k: string]: Change } = {};
 
  /**
   * @param {!Change} change
   */
  trackChildChange(change: Change) {
    const type = change.type;
    const childKey /** @type {!string} */ = change.childName;
    assert(
      type == Change.CHILD_ADDED ||
        type == Change.CHILD_CHANGED ||
        type == Change.CHILD_REMOVED,
      'Only child changes supported for tracking'
    );
    assert(
      childKey !== '.priority',
      'Only non-priority child changes can be tracked.'
    );
    const oldChange = safeGet(this.changeMap_, childKey) as Change;
    if (oldChange) {
      const oldType = oldChange.type;
      Iif (type == Change.CHILD_ADDED && oldType == Change.CHILD_REMOVED) {
        this.changeMap_[childKey] = Change.childChangedChange(
          childKey,
          change.snapshotNode,
          oldChange.snapshotNode
        );
      } else Iif (
        type == Change.CHILD_REMOVED &&
        oldType == Change.CHILD_ADDED
      ) {
        delete this.changeMap_[childKey];
      } else Eif (
        type == Change.CHILD_REMOVED &&
        oldType == Change.CHILD_CHANGED
      ) {
        this.changeMap_[childKey] = Change.childRemovedChange(
          childKey,
          oldChange.oldSnap
        );
      } else if (
        type == Change.CHILD_CHANGED &&
        oldType == Change.CHILD_ADDED
      ) {
        this.changeMap_[childKey] = Change.childAddedChange(
          childKey,
          change.snapshotNode
        );
      } else if (
        type == Change.CHILD_CHANGED &&
        oldType == Change.CHILD_CHANGED
      ) {
        this.changeMap_[childKey] = Change.childChangedChange(
          childKey,
          change.snapshotNode,
          oldChange.oldSnap
        );
      } else {
        throw assertionError(
          'Illegal combination of changes: ' +
            change +
            ' occurred after ' +
            oldChange
        );
      }
    } else {
      this.changeMap_[childKey] = change;
    }
  }
 
  /**
   * @return {!Array.<!Change>}
   */
  getChanges(): Change[] {
    return getValues(this.changeMap_);
  }
}